class Redprint(object):
    ''' 其实不管是红图还是蓝图,他们的核心就是提供划分模块的功能,本质上
        他们就是把规则,函数通过add_url_rule这个方法注册到app的字典中
        然后通过请求的url信息调用字典中的api,最后返回响应给server'''
    def __init__(self, name):
        self.name = name
        self.mound = []

    def route(self, rule, **options): # **options -> 指定的请求方法列表
        ''' route装饰器的作用其实是记录下函数和规则
            最后也没有调用原来的函数,但是这种装饰器和函数的搭配
            让代码变的非常优雅'''
        def decorator(f):
            self.mound.append((f, rule, options))
            return f
        return decorator

    def register_blueprint(self, bp, url_prefix=None):
        ''' 当前的红图在注册路由的时候,是在当前函数下完成的
            而蓝图在注册路由的时候,是在route下完成的
            调用add_url_rule '''
        for f, rule, options in self.mound:
            # 看当前函数有没有传入endpoint,没有传入使用默认值(函数名)当做endpoint
            # 这里的name起到了权限管理中简化代码的作用
            endpoint = self.name + '+' + options.pop("endpoint", f.__name__)
            if url_prefix is None:
                bp.add_url_rule(rule, endpoint, f, **options)
            else:
                bp.add_url_rule(url_prefix + rule, endpoint, f, **options)
